package com.itheima.consumer.config;


import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 通过定义bean来创建交换机，队列，绑定关系
 */
@Configuration
public class Fanoutconfiguration {


    //定义一个fanout交换机(两种方式)
    @Bean
    public FanoutExchange fanoutExchange() {
        //return new FanoutExchange("hmall.fanout");    直接创建对象
        return ExchangeBuilder.fanoutExchange("hamll.fanout").build();  //用ExchangeBuilder这个接口调用实现类build出来
    }

    //创建队列
    @Bean
    public Queue fanoutQueue1() {
        //QueueBuilder.durable("fanout.queue1").build();    用QueueBuilder调用实现类durable来持久化到磁盘创建队列(不易丢失)  nodurable指示不持久化
        //return new Queue("fanout.queue1",ture);   直接创建对象 也可以指定是否要持久化到磁盘,默认是要
        return QueueBuilder.durable("fanout.queue1").build();// build出来 durable将会持久化到磁盘,让消息持久化
    }

    //绑定队列和交换机关系
    @Bean
    public Binding fanoutQueue1Binding() {
        return BindingBuilder.bind(fanoutQueue1()).to(fanoutExchange());
    }

    //绑定队列和交换机关系  方法二 传参
    /*
    在 Spring 中，当你使用 @Bean 注解定义一个方法时，Spring 会将该方法的返回值注册为一个 Bean，默认情况下：
    Bean 的名字是方法名（除非你手动指定 name 属性）
    上面的fanoutQueue1方法定义了一个名为 fanoutQueue1 的 Bean，类型是 Queue
    所以，当其他地方的方法参数声明为Queue fanoutQueue1, Spring 会自动注入该 Bean。
    @Bean
    public Binding fanoutQueue1Binding2(Queue fanoutQueue1 , FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }*/

    //创建队列
    @Bean
    public Queue fanoutQueue2() {
        //return new Queue("fanout.queue2");   直接创建对象 也可以指定是否要持久化到磁盘,默认是要
        return QueueBuilder.durable("fanout.queue2").build();// build出来 durable将会持久化到磁盘,让消息持久化
    }

    //绑定队列和交换机关系
    @Bean
    public Binding fanoutQueue2Binding() {
        return BindingBuilder.bind(fanoutQueue2()).to(fanoutExchange());
    }


}
